<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>排序算法</title>
</head>

<body>
    <script>
        const array = [3, 4, 7, 8, 2, 1, 9, 6, 10, 5]

        // 冒泡排序 从第一个开始比较 大的往后挪
        function bubbleSort(array) {
            for (let j = array.length; j > 0; j--) {
                for (let i = 0; i < j - 1; i++) {
                    if (array[i] > array[i + 1]) {
                        const temp = array[i]
                        array[i] = array[i + 1]
                        array[i + 1] = temp
                    }
                }
            }
            return array
        }

        // 选择排序 选择最小的一个放在最前面
        function selectSort(array) {
            let resultArray = []
            for (let i = array.length; i > 0; i--) {
                resultArray.push(array.splice(array.indexOf(Math.min(...array)), 1)[0]);
            }
            return resultArray
        }

        // 快速排序 选择基准点 比基准点小的放左边 大的放右边
        function quickSort(array) {
            // 形参有效性检验
            if (!array instanceof Array) return new Error('传入的参数不是数组')
            if (array.length <= 1) return array

            // 存放基准数两边的数
            let left = []
            let right = []

            // 基准数下标
            const midIndex = Math.floor(array.length / 2)
            const midNumber = array.splice(midIndex - 1, 1)[0]

            // 小的放左边 大的放右边
            for (let i = 0; i < array.length; i++) {
                if (array[i] < midNumber) left.push(array[i])
                else right.push(array[i])
            }

            // 合并数组
            return quickSort(left).concat([midNumber], quickSort(right))
        }

        console.log('冒泡排序结果：', bubbleSort([...array]));
        console.log('选择排序结果：', selectSort([...array]));
        console.log('快速排序结果：', quickSort([...array]));
    </script>
</body>

</html>